package com.atguigu.dga.governance.assess.storage;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.dga.governance.assess.Assessor;
import com.atguigu.dga.governance.bean.AssessParam;
import com.atguigu.dga.governance.bean.GovernanceAssessDetail;
import com.atguigu.dga.meta.bean.TableMetaInfo;
import com.atguigu.dga.meta.constant.CodeConst;
import org.apache.arrow.flatbuf.Int;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;


@Component("TABLE_SIMILAR")
public class TableSimilarAssessor extends Assessor {


    //同层次两个表字段重复超过{percent}%，则给0分，其余给10分
    // 1  参数增加 其他所有表的清单
    // 2  循环遍历所有表 （过滤： 1  排除当前表  2 排除其他层次的表
    // 3    两表对比 ：  有几个字段相同
    // 4               相同的字段数/总字段数 占比
    // 5                用占比与percent 对比
    // 6                如果超过percent  给差评   问题描述  和哪张表相似



    @Override
    public void checkProblem(GovernanceAssessDetail governanceAssessDetail, AssessParam assessParam) throws ParseException {

        // 1  参数增加 其他所有表的清单
        List<TableMetaInfo> allTableMetaInfoList = assessParam.getAllTableMetaInfoList();
        TableMetaInfo curTableMetaInfo  = assessParam.getTableMetaInfo();

        String metricParamsJson = assessParam.getGovernanceMetric().getMetricParamsJson();
        JSONObject paramJsonObj = JSON.parseObject(metricParamsJson);
        BigDecimal paramPercent = paramJsonObj.getBigDecimal("percent");

        //  排除ods的表
        if(curTableMetaInfo.getTableMetaInfoExtra().getDwLevel().equals(CodeConst.DW_LEVEL_ODS)){
            return;
        }

        List<String> similarTableNameList=new ArrayList<>();
        // 2  循环遍历所有表 （过滤： 1  排除当前表  2 排除其他层次的表
        for (TableMetaInfo otherTableMetaInfo : allTableMetaInfoList) {// 1  排除当前表
            if(otherTableMetaInfo.getTableName().equals(curTableMetaInfo.getTableName())
                && otherTableMetaInfo.getSchemaName().equals(curTableMetaInfo.getSchemaName())
            ){
               continue;
            }
            if(!otherTableMetaInfo.getTableMetaInfoExtra().getDwLevel().equals(curTableMetaInfo.getTableMetaInfoExtra().getDwLevel())){
                continue;    //2 排除其他层次的表
            }
            // 3    两表对比 ：  有几个字段相同
            String curColNameJson = curTableMetaInfo.getColNameJson();
            List<JSONObject> curColJsonObjList = JSON.parseArray(curColNameJson, JSONObject.class);

            String otherColNameJson = otherTableMetaInfo.getColNameJson();
            List<JSONObject> otherColJsonObjList = JSON.parseArray(otherColNameJson, JSONObject.class);
            Set<String> otherNameSet = otherColJsonObjList.stream().map(jsonObject -> jsonObject.getString("name")).collect(Collectors.toSet());

            Integer sameColCount=0;
            for (JSONObject curJsonObject : curColJsonObjList) {
                 if(otherNameSet.contains(curJsonObject.getString("name"))){
                     sameColCount++;
                 }
            }
            // 4               相同的字段数/总字段数 占比

            BigDecimal samePercent = BigDecimal.valueOf(sameColCount).movePointRight(2).divide(BigDecimal.valueOf(curColJsonObjList.size()), 1, BigDecimal.ROUND_HALF_UP);
            // 5                用占比与percent 对比
            if(samePercent.compareTo(paramPercent)>0){ //前大后小  加入相似表清单中
                // 6                如果超过percent  给差评   问题描述  和哪张表相似
                similarTableNameList.add(otherTableMetaInfo.getSchemaName()+"."+ otherTableMetaInfo.getTableName());
            }
        }

        // 只要清单中有值 就说明存在相似表 给差评
        if(similarTableNameList.size()>0){
            governanceAssessDetail.setAssessScore(BigDecimal.ZERO);
            governanceAssessDetail.setAssessProblem("存在相似表:"+ StringUtils.join(similarTableNameList,",") );

        }


    }
}
